#ifndef __LINKED_LIST_HPP__
#define __LINKED_LIST_HPP__

#include <iostream>
using namespace std;
// -fsanitize=address
using DataType = int;


class Node
{
    friend class Linked_list;
private:
    DataType *data = nullptr;
    DataType data_size;
    Node *next = nullptr;
public:
    Node(DataType *data, DataType data_size);
    Node(const Node &node);
    ~Node();
    DataType get_data_size()const;
    DataType *get_data()const;
    Node *get_next()const;
    bool set_next(Node *next);
    bool set_data(DataType *data, DataType data_size);

};
class Linked_list
{
    friend void printf_list(Linked_list &list);
private:
    // struct Node
    // {
    //     DataType data;
    //     Node *next;
    // };
    Node *head = nullptr;
    Node *tail = nullptr;
    DataType size = 0;
public:
    Linked_list();
    Linked_list(DataType *data, DataType data_size, DataType size);
    Linked_list(const Linked_list &list);
    ~Linked_list();
    bool is_empty();
    bool index_boundary(DataType index)const;
    bool clear();
    bool insert(DataType *data, DataType data_size);
    bool insert(DataType index, DataType *data, DataType data_size);
    bool remove(DataType index);
    
    DataType *get_head()const;
    DataType *get_tail()const;
    DataType get_size()const;
    DataType *get_data(DataType index)const;
    Node *get_node(DataType index)const;
    Node *get_next(DataType index)const;
    Node *get_prev(DataType index)const;
};




#endif
